import fs from 'fs';
import path from 'path';
import Yaml from 'yaml'; // 使用 'yaml' 库解析文件
import { fileURLToPath } from 'url';

export class AccessControlPlugin extends plugin {
  constructor() {
    super({
      name: '[SB]访问控制',
      dsc: '仅我可用和给大家用插件',
      event: 'message',
      priority: 5000,
      rule: [
        { reg: /^(#|\/)?仅我可上$/, fnc: 'restrictToMe' },  // 仅我可用
        { reg: /^(#|\/)?给大家上$/, fnc: 'allowEveryone' }   // 给大家用
      ]
    });
  }

  // 动态获取根目录路径
  getRootDir() {
    const __filename = fileURLToPath(import.meta.url);  // 获取当前模块的文件路径
    const __dirname = path.dirname(__filename);        // 获取当前文件的目录
    return path.resolve(__dirname, '../../../');  // 动态获取根目录
  }

  // 获取根目录的 package.json
  getPackageJson() {
    const rootDir = this.getRootDir(); // 获取根目录
    const packageJsonPath = path.join(rootDir, 'package.json'); // 构建 package.json 的路径
    return JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')); // 读取并解析 package.json
  }

  // 获取配置文件路径
  getConfigFilePath() {
    const rootDir = this.getRootDir(); // 获取根目录
    return path.join(rootDir, 'config/config/other.yaml'); // 构建完整的配置文件路径
  }

  // 加载 YAML 文件
  loadYAML() {
    try {
      const configFilePath = this.getConfigFilePath();
      const fileContents = fs.readFileSync(configFilePath, 'utf8');
      return Yaml.parse(fileContents); // 使用 Yaml.parse 解析 YAML 文件
    } catch (error) {
      logger.error('读取 YAML 文件时出错:', error);
      return null;
    }
  }

  // 保存 YAML 文件
  saveYAML(data) {
    try {
      const configFilePath = this.getConfigFilePath();
      const yamlStr = Yaml.stringify(data); // 使用 Yaml.stringify 保存 YAML 文件
      fs.writeFileSync(configFilePath, yamlStr, 'utf8');
      logger.info('成功更新配置文件');
    } catch (error) {
      logger.error('保存 YAML 文件时出错:', error);
    }
  }

  // 仅我可用 - 将当前用户QQ号添加到白名单中
  async restrictToMe(e) {
    if(!e.isMaster) return false
    const config = this.loadYAML();
    if (!config) {
      return e.reply('无法读取配置文件，请检查文件路径或格式。');
    }

    const packageJson = this.getPackageJson();
    const whiteKey = packageJson.name === 'miao-yunzai' ? 'whiteQQ' : 'whiteUser'; // 根据 package.json 的 name 字段决定白名单键名

    // 将当前用户QQ号添加到白名单中
    config[whiteKey] = e.user_id.toString();
    this.saveYAML(config);

    e.reply(`现在只有你可以上了！`);
  }

  // 给大家用 - 清空白名单字段
  async allowEveryone(e) {
    if(!e.isMaster) return false
    const config = this.loadYAML();
    if (!config) {
      return e.reply('无法读取配置文件，请检查文件路径或格式。');
    }

    const packageJson = this.getPackageJson();
    const whiteKey = packageJson.name === 'miao-yunzai' ? 'whiteQQ' : 'whiteUser'; // 根据 package.json 的 name 字段决定白名单键名

    // 清空白名单字段
    config[whiteKey] = packageJson.name === 'trss-yunzai' ? null : '';
    this.saveYAML(config);

    e.reply(`现在大家都可以上了！`);
  }
}
